from awlsim.common.cython_support cimport *
from awlsim.core.cpu cimport *

cdef class TimerConstsClass(object):
	cdef public uint8_t TB_10MS
	cdef public uint8_t TB_100MS
	cdef public uint8_t TB_1S
	cdef public uint8_t TB_10S

	cdef public uint8_t TB_SHIFT
	cdef public uint8_t TB_MASK
	cdef public uint16_t TB_MASK_S

	cdef public uint16_t TB_10MS_S
	cdef public uint16_t TB_100MS_S
	cdef public uint16_t TB_1S_S
	cdef public uint16_t TB_10S_S

cdef TimerConstsClass TimerConsts

cdef class Timer(object):
	cdef public S7CPU cpu
	cdef public uint32_t index
	cdef public _Bool prevVKE_S
	cdef public _Bool prevVKE_FR
	cdef public uint16_t timebase
	cdef public _Bool deadlineActionSetStatus
	cdef public double deadline
	cdef public double remaining
	cdef public _Bool status
	cdef public _Bool running

	cdef _Bool get(self)
	cdef void reset(self)
	cdef setTimevalS5T(self, uint16_t s5t)
	cdef uint32_t getTimevalBin(self) except? 0xFFFFFFFF
	cdef uint16_t getTimevalS5T(self) except? 0xFFFF
	cdef uint16_t getTimevalS5TwithBase(self) except? 0xFFFF
	cdef double __getRemainingSeconds(self)
	cdef void __updateRemaining(self)
	cdef run_FR(self)
	cdef run_SI(self, uint16_t s5t)
	cdef run_SV(self, uint16_t s5t)
	cdef run_SE(self, uint16_t s5t)
	cdef run_SS(self, uint16_t s5t)
	cdef run_SA(self, uint16_t s5t)
	cdef __start(self, uint16_t s5t)
	cdef void __checkDeadline(self)

cdef uint16_t _seconds_to_s5t_tb10ms(double seconds)
cdef uint16_t _seconds_to_s5t_tb100ms(double seconds)
cdef uint16_t _seconds_to_s5t_tb1s(double seconds)
cdef uint16_t _seconds_to_s5t_tb10s(double seconds)

cdef uint32_t Timer_seconds_to_s5t(double seconds) except? 0xFFFFFFFF
cdef double Timer_s5t_to_seconds(uint16_t s5t) except? -1.0
